package cn.tedu.v5;

import java.io.*;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * Version 5   登录与退出
 * Version 6  在线用户列表：统计上线名称
 *                 消息转发--交互--服务器客户端文字
 */
public class Client {
    private static final String HOST = "127.0.0.1";
    private static final Integer PORT = 7766;

    private Socket socket;
    private String ip;

    private PrintWriter pw;
    private BufferedReader br;

    public Client() {

        try {
            socket = new Socket(HOST, PORT);
            ip = socket.getInetAddress().getHostAddress();

            br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
            pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8")), true);
        } catch (SocketException e) {
            System.out.println("连接被重置");
        } catch (UnknownHostException e) {  //用户地址出问题了（异常）
            System.out.println("IP地址有问题，请询问服务器端！");
        } catch (IOException e) { //IO异常：连接失效，客户端主动退出了
            System.out.println("客户端主动退出了：断开连接");
        }
    }

    public void start() {

        try {
            //目的：不捕获，确定没有问题，捕获代码块具体针对服务器结构
            System.out.println("欢迎使用好运牌QQ聊天室");
            Scanner input = new Scanner(System.in);

            //一，接收登录提示
            //1.读入服务器端--输出流
            String severMessage= br.readLine();//服务器端：写“请输入用户名”
            System.out.println(severMessage);//读入账号，必须写出
            //2.需要写出用户名
            String username= input.nextLine();//客户端：输入用户名
            //3.写出用户名：发给服务端
            pw.println(username);//写出给服务器---获取账号

            //二，接收登录的密码提示
            //1.读入客户端---输出流
            severMessage= br.readLine();//服务器端
            System.out.println(severMessage);
            //2.写出密码
            String password= input.nextLine();
            //3.写出密码，交给服务器
            pw.println(password);

            //三，服务器端验证账号跟密码是否正确
            //3.1 读入账号和密码正确的情况
            severMessage=br.readLine();//"登录成功，欢迎进入好运牌聊天室"
            System.out.println(severMessage);//客户端打印：登录成功
            //3.2 判断如果是"登录成功，欢迎进入好运牌聊天室"  前提：登录成功
            if (severMessage.startsWith("登录成功")){  // true 聊天
                chat();
            }

        } catch (IOException e){
            System.out.println("客户端断开链接");
        }
        finally {
            if (pw != null)
                pw.close();
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {
                    System.out.println("服务器端链接失败~~");
                }
            if (socket != null && !socket.isClosed()) {
                System.out.println("客户端关闭成功");
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println("客户端关闭失败~");
                }
            }
        }
    }
    //1.start  方法下---封装    客户端   相互通话  chat
    private void chat() {
        new Thread(() -> {
            try {
                String message;
                while ((message = br.readLine()) != null) {
                    System.out.println("服务器端说：" + message);
                    System.out.println("客户端请输入：");

                if (message.equalsIgnoreCase("exit")){
                    System.exit(0);
                }
                }
            } catch (IOException e) {
                System.out.println("服务端发来的消息断开了~");
            }
        }).start();
        Scanner input = new Scanner(System.in);
        while (true) {
            System.out.println("客户端请输入：");
            String say = input.nextLine();
            pw.println("客户端说：" + say);

            if (say.equalsIgnoreCase("exit")) {
                System.out.println("好的");
                break;
            }
        }
    }
    public static void main(String[] args) {
        new Client().start();
    }
}
